/**
 * 数据模型使用示例
 * 演示如何使用数据模型和相关工具函数
 */

import type { Document, CreateDocumentInput, UpdateDocumentInput } from '../types/document'
import { 
  generateDocumentId, 
  generateSummary, 
  calculateWordCount, 
  createEmptyDocument, 
  updateDocumentTimestamp 
} from '../utils/documentUtils'
import { 
  validateCreateDocumentInput, 
  validateUpdateDocumentInput, 
  validateDocument,
  normalizeDocument 
} from '../services/storage/validation'

/**
 * 演示创建文档
 */
export const demonstrateDocumentCreation = (): void => {
  console.log('=== 数据模型演示：文档创建 ===')

  // 创建文档输入
  const createInput: CreateDocumentInput = {
    title: '我的第一篇文档',
    content: `# 欢迎使用融媒智创工坊

这是一篇测试文档，用于演示数据模型的使用。

## 功能特点

- 支持 Markdown 格式
- 自动生成摘要
- 字数统计
- 数据验证

让我们开始创作吧！`
  }

  // 验证输入数据
  const validation = validateCreateDocumentInput(createInput)
  console.log('输入验证结果:', validation)

  if (validation.isValid) {
    // 创建完整的文档对象
    const newDocument = createEmptyDocument(createInput.title, createInput.content || '')
    
    console.log('创建的文档:', {
      id: newDocument.id,
      title: newDocument.title,
      contentLength: newDocument.content.length,
      createdAt: newDocument.createdAt.toISOString(),
      updatedAt: newDocument.updatedAt.toISOString()
    })

    // 生成摘要和字数统计
    const summary = generateSummary(newDocument.content)
    const wordCount = calculateWordCount(newDocument.content)

    console.log('文档摘要:', summary)
    console.log('字数统计:', wordCount)
  }
}

/**
 * 演示文档更新
 */
export const demonstrateDocumentUpdate = (): void => {
  console.log('\n=== 数据模型演示：文档更新 ===')

  // 创建一个初始文档
  let document = createEmptyDocument('测试文档', '这是初始内容')
  console.log('初始文档:', document.title)

  // 更新文档
  const updateInput: UpdateDocumentInput = {
    title: '更新后的测试文档',
    content: '这是更新后的内容，包含更多信息。'
  }

  // 验证更新输入
  const validation = validateUpdateDocumentInput(updateInput)
  console.log('更新验证结果:', validation)

  if (validation.isValid) {
    // 应用更新
    document = {
      ...document,
      ...updateInput,
      updatedAt: new Date()
    }

    // 规范化文档数据
    document = normalizeDocument(document)

    console.log('更新后的文档:', {
      id: document.id,
      title: document.title,
      contentLength: document.content.length,
      updatedAt: document.updatedAt.toISOString()
    })
  }
}

/**
 * 演示数据验证
 */
export const demonstrateValidation = (): void => {
  console.log('\n=== 数据模型演示：数据验证 ===')

  // 测试有效数据
  const validDoc: Partial<Document> = {
    id: generateDocumentId(),
    title: '有效的文档标题',
    content: '这是有效的文档内容',
    createdAt: new Date(),
    updatedAt: new Date()
  }

  const validResult = validateDocument(validDoc)
  console.log('有效数据验证:', validResult)

  // 测试无效数据
  const invalidDoc: Partial<Document> = {
    title: '', // 空标题
    content: 'A'.repeat(1000001), // 超长内容
    createdAt: new Date(),
    updatedAt: new Date(Date.now() - 86400000) // 更新时间早于创建时间
  }

  const invalidResult = validateDocument(invalidDoc)
  console.log('无效数据验证:', invalidResult)
}

/**
 * 演示工具函数
 */
export const demonstrateUtilityFunctions = (): void => {
  console.log('\n=== 数据模型演示：工具函数 ===')

  // 测试ID生成
  const ids = Array.from({ length: 3 }, () => generateDocumentId())
  console.log('生成的文档ID:', ids)

  // 测试摘要生成
  const testContent = `# 这是一个测试文档

包含**粗体**文字和*斜体*文字，以及一些[链接](http://example.com)。

这个段落用于测试摘要生成功能，看看能否正确移除Markdown格式并截取合适的长度。

还有更多内容...`

  const summary = generateSummary(testContent)
  console.log('生成的摘要:', summary)

  // 测试字数统计
  const wordCount = calculateWordCount(testContent)
  console.log('字数统计:', wordCount)

  // 测试中英文混合内容
  const mixedContent = '这是中文内容 mixed with English words 和一些标点符号！'
  const mixedWordCount = calculateWordCount(mixedContent)
  console.log('中英文混合字数:', mixedWordCount)
}

/**
 * 运行所有演示
 */
export const runAllDemonstrations = (): void => {
  console.log('融媒智创工坊 - 数据模型演示\n')
  
  demonstrateDocumentCreation()
  demonstrateDocumentUpdate()
  demonstrateValidation()
  demonstrateUtilityFunctions()
  
  console.log('\n=== 演示完成 ===')
}

// 如果直接运行此文件，执行演示
if (typeof window === 'undefined') {
  // Node.js 环境
  runAllDemonstrations()
}